package com.woniuxy.ref;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.woniuxy.ai.WeatherAsk;
import com.woniuxy.entity.*;
import com.woniuxy.tools.WoniuParamTool;
import com.woniuxy.tools.WoniuTool;

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author: 马宇航
 * @Todo: 测试下，反射的效果
 * @DateTime: 25/09/08/星期一 15:37
 * @Component: 成都蜗牛学苑
 **/
public class Test1 {
    public static void main(String[] args) throws NoSuchMethodException, JsonProcessingException {
        WeatherAsk weatherAsk = new WeatherAsk();
        //获取所有方法，只有加了我们的自定义注解的方法，才需要拼接到JSON上
        Method[] methods = weatherAsk.getClass().getMethods();
//        ObjectNode tools = new ObjectMapper().createObjectNode();
        ChatEntity chatEntity = new ChatEntity();
        chatEntity.setModel("gpt-3.5-turbo");
        List<Tools> list = new ArrayList<>();
        chatEntity.setTools(list);
        chatEntity.setStream(false);
        chatEntity.setMessages(List.of(new UserMessage("你好")));
        for (Method method : methods) {
            Tools tools = new Tools();
            list.add(tools);
            //有这个注解，我才继续往下拼接JSON
            if(method.getAnnotation(WoniuTool.class)!=null){
                //获取注解上的信息
                WoniuTool woniuTool = method.getAnnotation(WoniuTool.class);
                //方法上的 注解的名字，其实就是提交给AI的函数名，可以和代码中的函数名不一致（可以做个map映射就ok)
                // json中的函数名字name
                WoniuFunction function = new WoniuFunction();
                tools.setFunction(function);
                InnerFunction innerFunction = new InnerFunction();
                function.setFunction(innerFunction);
                innerFunction.setName(woniuTool.name());
                innerFunction.setDescription(woniuTool.description());
                //取出对应的函数的参数的注解
                if (method.getParameterAnnotations().length>0){
//                    ObjectNode parametersJson = new ObjectMapper().createObjectNode();
//
//                    function.put("parameters",parametersJson);
//                    parametersJson.put("type","object");
                    ObjectNode properties = new ObjectMapper().createObjectNode();
//                    parametersJson.put("properties",properties);
                    //有参数注解，有另外的方案,先取出所有的参数列表，会考虑参数名和参数类型的封装
                    Parameter[] parameters = method.getParameters();
                    for (Parameter parameter : parameters) {
                        //取出参数注解 判断是不是我们的参数
                        if (parameter.getAnnotation(WoniuParamTool.class)!=null){
                            //取出自定义的参数内容
                            WoniuParamTool paramTool = parameter.getAnnotation(WoniuParamTool.class);
                            //继续拼接
                            ObjectNode param = new ObjectMapper().createObjectNode();
                            properties.put(parameter.getName(),param);
                            param.put("type",parameter.getType().getSimpleName().toLowerCase());
                            param.put("description",paramTool.description());
                        }
                    }
                }else {
                    //无参数注解，有无参数注解的用法
                }
            }
            System.out.println(new ObjectMapper().valueToTree(chatEntity));
        }
    }
}
